package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICompanyDAO;
import org.jsola.hr.dto.CompanyAddDTO;
import org.jsola.hr.dto.CompanyUpdateDTO;
import org.jsola.hr.entity.CompanyDO;
import org.jsola.hr.query.CompanyQuery;
import org.jsola.hr.vo.CompanyImportExcelVO;
import org.jsola.hr.vo.CompanyListVO;
import org.jsola.hr.vo.CompanyVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;
import java.util.Map;


/**
 * 用工单位
 *
 * @author zhr
 */
public interface ICompanyService extends IService<ICompanyDAO, CompanyDO> {
    /**
     * 同步用工单位到招聘
     *
     * @param companyIds 用工单位Ids
     * @param tokenUser  当前用户
     * @return 用工单位详情信息
     */
    Integer synchronizationCompanyToRecruit(String[] companyIds, TokenUser tokenUser);

    /**
     * 新增用工单位
     *
     * @param companyAddDTO 新增用工单位DTO
     * @param tokenUser     当前用户
     * @return 用工单位详情信息
     */
    CompanyVO save(CompanyAddDTO companyAddDTO, TokenUser tokenUser);

    /**
     * 导入excel新增用工单位
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param force     true忽略错误的行，false有错误中断上传
     * @return 成功的条数
     */
    CompanyImportExcelVO importFile(File file, TokenUser tokenUser, Boolean force);

    /**
     * 新增用工单位（不抛出异常，新增失败返回null）
     *
     * @param companyAddDTO 用工单位信息
     * @param tokenUser     当前用户
     * @return 用工单位信息
     */
    CompanyVO saveNoException(CompanyAddDTO companyAddDTO, TokenUser tokenUser);

    /**
     * 修改用工单位
     *
     * @param companyUpdateDTO 修改用工单位DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(CompanyUpdateDTO companyUpdateDTO, TokenUser tokenUser);


    /**
     * 用工单位高级配置
     *
     * @param companyId     用工单位Id
     * @param companyAddDTO 新增用工单位
     * @param tokenUser     当前用户
     * @return 下发失败列表
     */
    List<String> addAdvancedConfiguration(String companyId, CompanyAddDTO companyAddDTO, TokenUser tokenUser);


    /**
     * 批量删除用工单位，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param companyIds 用工单位id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... companyIds);

    /**
     * 根据用工单位id查找(禁止多线程调用)
     *
     * @param companyId 用工单位id
     * @param siteId    所属站点id
     * @return 用工单位详情信息
     */
    @Deprecated
    CompanyVO selectById(String companyId, String siteId);

    /**
     * 根据用工单位id查找(禁止多线程调用)
     *
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return 用工单位详情信息
     */
    @Deprecated
    CompanyVO selectById(String companyId, TokenUser tokenUser);

    /**
     * 根据用工单位id查找用工单位信息(采用多线程查询)
     *
     * @param companyId
     * @param tokenUser
     * @return
     */
    CompanyVO selectCompanyInfoByIdASync(String companyId, TokenUser tokenUser);

    /**
     * 根据主键查询实体
     *
     * @param companyId
     * @param siteId
     * @return
     */
    CompanyVO selectBaseCompanyById(String companyId, String siteId);

    /**
     * 根据主键集合查询实体
     *
     * @param companyIdList 用工单位id集合
     * @param siteId        租户id
     * @return 用工单位集合
     */
    List<CompanyDO> selectBaseCompanyByIdList(List<String> companyIdList, String siteId);

    /**
     * 根据用工单位id查找
     *
     * @param companyIdList 用工单位id集合
     * @param siteId        所属站点id
     * @return 用工单位详情信息
     */
    List<CompanyDO> selectByIds(List<String> companyIdList, String siteId);

    /**
     * 根据用工单位id查找
     *
     * @param companyIdList 用工单位id集合
     * @return 用工单位详情信息
     */
    List<CompanyDO> selectByIdsNotSiteId(List<String> companyIdList);

    /**
     * 查询所有用工单位
     *
     * @return 用工单位详情信息
     */
    List<CompanyDO> selectAll();

    List<CompanyDO> selectAll(String siteId);

    /**
     * 根据用工单位id查找,包含已经删除的用工单位
     *
     * @param companyIdList 用工单位id集合
     * @param siteId        所属站点id
     * @return 用工单位详情信息
     */
    List<CompanyDO> selectByIdsContainDelete(List<String> companyIdList, String siteId);

    /**
     * 查询用工单位
     *
     * @param companyQuery 查询条件
     * @param tokenUser    登录用户
     * @return 用工单位列表信息
     */
    List<CompanyListVO> select(CompanyQuery companyQuery, TokenUser tokenUser);

    /**
     * 查询用工单位
     *
     * @param tokenUser 当前用户
     * @return 用工单位列表信息
     */
    List<CompanyListVO> selectCompanyList(TokenUser tokenUser);

    /**
     * 查询用工单位记录数
     *
     * @param companyQuery 查询条件
     * @param siteId       所属站点id
     * @return 用工单位记录数
     */
    int selectCount(CompanyQuery companyQuery, String siteId);


    /**
     * 分页查询用工单位
     *
     * @param companyQuery 查询条件
     * @param tokenUser    登录用户
     * @return 用工单位列表信息
     */
    Page<CompanyListVO> selectPage(CompanyQuery companyQuery, TokenUser tokenUser);


    /**
     * 根据用工单位id查找
     *
     * @param companyId 用工单位id
     * @param siteId    所属站点id
     * @return 用工单位
     */
    CompanyDO selectDOById(String companyId, String siteId);

    /**
     * 根据用工单位id查找,无站点
     *
     * @param companyId 用工单位id
     * @return 用工单位
     */
    CompanyDO selectDOByIdNotSite(String companyId);

    /**
     * 查询用工单位
     *
     * @param companyQuery 查询条件
     * @param tokenUser    登录用户
     * @return 用工单位列表
     */
    List<CompanyDO> selectDO(CompanyQuery companyQuery, TokenUser tokenUser);

    /**
     * 批量根据用工单位id查询用工单位
     *
     * @param ids    要查询的用工单位id
     * @param siteId 当前站点
     * @return 用工单位列表
     */
    List<CompanyListVO> listVoListByIds(String siteId, String... ids);

    /**
     * 批量根据用工单位id查询用工单位
     *
     * @param ids    要查询的用工单位id
     * @param siteId 当前站点
     * @return 用工单位列表
     */
    List<CompanyVO> listVoByIds(String siteId, String... ids);


    /**
     * 查找站点所有用工单位信息
     *
     * @param siteId 所属站点id
     * @return 用工单位
     */
    List<CompanyDO> selectBySiteId(String siteId);

    /**
     * 根据Id查询公司删掉的也差
     *
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 公司
     */
    CompanyDO selectDOByIdNotValid(String companyId, String siteId);

    /**
     * 根据Id查询公司删掉的也差
     *
     * @param companyName 公司名称
     * @param siteId      站点
     * @return 公司
     */
    CompanyDO selectByName(String companyName, String siteId);

    /**
     * 根据用工单位名称查询
     *
     * @param companyNameList 用工单位名称
     * @param siteId          站点
     * @return 用工单位
     */
    List<CompanyDO> selectByNameList(List<String> companyNameList, String siteId);

    /**
     * 平铺自己有权限的用工单位
     *
     * @param tokenUser 当前用户
     * @return 用工单位
     */
    List<CompanyDO> tileCompanyByUser(TokenUser tokenUser);

    /**
     * 平铺自己有权限的用工单位Id
     *
     * @param tokenUser 当前用户
     * @return 用工单位
     */
    List<String> tileCompanyIdByUser(TokenUser tokenUser);

    /**
     * 平铺自己有权限的用工单位Id
     *
     * @param tokenUser 当前用户
     * @return 用工单位
     */
    List<String> tileCompanyIdByUser2(TokenUser tokenUser);

    /**
     * 根据用工单位ID,查询上级分组，直到最后名称，用逗号隔开，类似：用工单位1,分组1-1,分组1，租户A
     * @param firstCompanyId
     * @return
     */
    Map searchCompanyName(String firstCompanyId, TokenUser tokenUser);

    /**
     * 分页查询没有分组的用工单位集合（用工单位直接挂在租户下的）
     * @param companyQuery
     * @param tokenUser
     * @return
     */
    Page<CompanyVO> selectPageNotInGroup(CompanyQuery companyQuery, TokenUser tokenUser);
}


